#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include "myblockqueue.hpp"
#include "Task.hpp"

// 消费者
void *Consumer(void *args)
{
    // Blockqueue<int> *bq = static_cast<Blockqueue<int> *>(args);
    Blockqueue<Task> *bq = static_cast<Blockqueue<Task> *>(args);

    while (true)
    {
        // int num = bq->pop();
        Task task = bq->pop();
        std::cout << "处理任务 : " << task.Getresult() <<"thread id = " << pthread_self() << std::endl;
        // sleep(1);
    }
}

// // 消费者
// void *Consumer(void *args)
// {
//     Blockqueue<int> *bq = static_cast<Blockqueue<int> *>(args);
//     while (true)
//     {
//         int num = bq->pop();
//         std::cout << "处理任务 : num = " << num << std::endl;
//         sleep(1);
//     }
// }

// 生产者
void *Productor(void *args)
{
    // Blockqueue<int> *bq = static_cast<Blockqueue<int> *>(args);
    Blockqueue<Task> *bq = static_cast<Blockqueue<Task> *>(args);
    int len = opers.size();
    while (true)
    {
        // int in = 10;
        // bq->push(10);
        int data1 = rand() % 10 + 1;
        usleep(10);
        int data2 = rand() % 10;
        char op = opers[rand() % len];
        Task task(data1, data2, op);
        task();
        bq->push(task);
        std::cout << "生产了一个任务 : " << task.GetTask() << "thread id = " << pthread_self() << std::endl;
        sleep(1);
    }
}

// // 生产者
// void *Productor(void *args)
// {
//     Blockqueue<int> *bq = static_cast<Blockqueue<int> *>(args);
//     int len = opers.size();
//     int num = 0;
//     while (true)
//     {
//         bq->push(num);
//         std::cout << "生产了一个任务 : num = " << num++ <<std::endl;
//         // sleep(1);
//     }
// }

int main()
{
    // Blockqueue<int> *bq = new Blockqueue<int>();
    Blockqueue<Task> *bq = new Blockqueue<Task>();
    pthread_t ctid[3], ptid[5];
    // pthread_t ctid;
    for (int i = 0; i < 3; i++)
    {
        pthread_create(ctid+i, nullptr, Productor, bq);
        sleep(1);
    }

    // pthread_t ptid;
    for (int i = 0; i < 5; i++)
    {
        pthread_create(ptid+i, nullptr, Consumer, bq);
        sleep(1);
    }

    for (int i = 0; i < 5; i++)
    {
        pthread_join(ctid[i], nullptr);
    }

    for (int i = 0; i < 5; i++)
    {
        pthread_join(ptid[i], nullptr);
    }

    delete bq;
    return 0;
}